/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.Anexo;
import br.com.foxinline.modelo.CertidaoObito;
import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.servico.CertidaoObitoServico;
import br.com.foxinline.servico.PessoaServico;
import br.com.foxinline.util.Msg;
import br.com.foxinline.utilitarios.ArquivoUtilitario;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarCertidaoObito implements Serializable {

    @EJB
    PessoaServico pessoaServico;
    @EJB
    CertidaoObitoServico certidaoServico;
    private CertidaoObito certidaoPesquisar;
    private CertidaoObito certidaoEditar;
    private CertidaoObito certidaoVisualizar;
    private CertidaoObito certidaoDeletar;
    private List<CertidaoObito> certidoes;
    private Pessoa pessoaPesquisar;
    private Pessoa pessoaEditar;
    private Pessoa pessoaVisualizar;
    private List<Anexo> anexosEditar;
    private List<Anexo> anexosVisualizar;
    private List<Anexo> anexosRemover = new ArrayList<Anexo>();
    private String eCertidao;
    private String vCertidao;
    private ArquivoUtilitario arquivoUtilitario = new ArquivoUtilitario();

    @PostConstruct
    public void init() {
        certidaoPesquisar = new CertidaoObito();
        pessoaPesquisar = iniciarPessoa();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        eCertidao = params.get("eCertidao");
        vCertidao = params.get("vCertidao");
        paramPost();
    }

    public void paramPost() {
        try {
            if (eCertidao != null) {
                certidaoEditar = certidaoServico.pesquisar(Long.parseLong(eCertidao));
                anexosEditar = certidaoEditar.getAnexos() != null ? certidaoEditar.getAnexos() : new ArrayList<Anexo>();
                pessoaEditar = certidaoEditar.getPessoa() != null ? certidaoEditar.getPessoa() : iniciarPessoa();
            }
            if (vCertidao != null) {
                certidaoVisualizar = certidaoServico.pesquisar(Long.parseLong(vCertidao));
                anexosVisualizar = certidaoVisualizar.getAnexos() != null ? certidaoVisualizar.getAnexos() : new ArrayList<Anexo>();
                pessoaVisualizar = certidaoVisualizar.getPessoa() != null ? certidaoVisualizar.getPessoa() : iniciarPessoa();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void pesquisar() {
        certidaoPesquisar.setPessoa(pessoaPesquisar);
        certidoes = certidaoServico.pesquisar(certidaoPesquisar);
    }

    public void atualizar() {
        try {
            if (!anexosEditar.isEmpty()) {
                arquivoUtilitario.gravarAnexos(anexosEditar);
                anexosEditar = arquivoUtilitario.removerBytes(anexosEditar);

                certidaoEditar.setAnexos(anexosEditar);
            } else {
                certidaoEditar.setAnexos(null);
                anexosEditar = new ArrayList<Anexo>();
            }

            certidaoEditar.setPessoa(pessoaEditar);
            certidaoServico.atualizar(certidaoEditar);

            for (Anexo a : anexosRemover) {
                arquivoUtilitario.excluirArquivo(new File(a.getUrl() + a.getNome()));
            }

            Msg.messagemInfo(Msg.SuccessFull);
            init();
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void deletar() {
        try {
            certidoes.remove(certidaoDeletar);
            certidaoServico.remover(certidaoDeletar);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void existeCliente() {
        Pessoa p = pessoaServico.existProprietario(pessoaEditar);

        if (p != null) {
            pessoaEditar = p;
        } else {
            pessoaEditar.setId(null);
        }
    }

    public List<SelectItem> getTipoDocumento() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoDocumento tipo : TipoDocumento.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public String dataCertidao() {
        if (certidaoVisualizar.getDataCertidao() != null) {
            return new SimpleDateFormat("dd/MM/yyyy").format(certidaoVisualizar.getDataCertidao());
        }
        return null;
    }

    public String dataNascimento() {
        if (eCertidao != null && pessoaEditar.getDataNascimento() != null) {
            return new SimpleDateFormat("dd/MM/yyyy").format(pessoaEditar.getDataNascimento());
        }
        if (vCertidao != null && pessoaVisualizar.getDataNascimento() != null) {
            return new SimpleDateFormat("dd/MM/yyyy").format(pessoaVisualizar.getDataNascimento());
        }
        return null;
    }
    private static int tamanhoMaximoNome = 10;

    public String nomeAnexo(Anexo a) {
        if (a.getNomeExibicao().length() >= tamanhoMaximoNome) {
            return a.getNomeExibicao().substring(0, tamanhoMaximoNome).concat("...");
        }
        return a.getNomeExibicao().replace(".png", "").replace(" ", "_");
    }

    public String nomeAnexoPdf(Anexo a) {
        if (a.getNomeExibicao().length() >= tamanhoMaximoNome) {
            return a.getNomeExibicao().substring(0, tamanhoMaximoNome).concat("...");
        }
        return a.getNomeExibicao().replace(".pdf", "").replace(" ", "_");
    }

    public void handleAnnex(FileUploadEvent event) throws IOException {
        try {
            System.err.println(anexosEditar);
            anexosEditar.add(arquivoUtilitario.adicionarArquivo(event));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerPesquisarCertidaoObito.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ManagerPesquisarCertidaoObito.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Remove o anexo da lista de anexos do processo que está sendo adicionado e
     * remove o arquivo do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerAnexo(Anexo anexo) {
        try {
            anexosRemover.add(anexo);
//            arquivoUtilitario.excluirArquivo(new File(anexo.getUrl() + anexo.getNome()));
            anexosEditar.remove(anexo);
        } catch (Exception e) {
            Msg.messagemError(Msg.Failure);
        }
    }

    public Pessoa iniciarPessoa() {
        Pessoa pessoa = new Pessoa();
        pessoa.setTipoDocumento(TipoDocumento.CPF);
        return pessoa;
    }

    public boolean isPessoaFisicaPesquisar() {
        return pessoaPesquisar.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    public boolean isPessoaFisica() {
        return eCertidao != null ? pessoaEditar.getTipoDocumento().equals(TipoDocumento.CPF) : pessoaVisualizar.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    public List<Anexo> getAnexosEditar() {
        return anexosEditar;
    }

    public void setAnexosEditar(List<Anexo> anexosEditar) {
        this.anexosEditar = anexosEditar;
    }

    public List<Anexo> getAnexosVisualizar() {
        return anexosVisualizar;
    }

    public void setAnexosVisualizar(List<Anexo> anexosVisualizar) {
        this.anexosVisualizar = anexosVisualizar;
    }

    public List<Anexo> getAnexosRemover() {
        return anexosRemover;
    }

    public void setAnexosRemover(List<Anexo> anexosRemover) {
        this.anexosRemover = anexosRemover;
    }

    public CertidaoObito getCertidaoDeletar() {
        return certidaoDeletar;
    }

    public void setCertidaoDeletar(CertidaoObito certidaoDeletar) {
        this.certidaoDeletar = certidaoDeletar;
    }

    public CertidaoObito getCertidaoEditar() {
        return certidaoEditar;
    }

    public void setCertidaoEditar(CertidaoObito certidaoEditar) {
        this.certidaoEditar = certidaoEditar;
    }

    public CertidaoObito getCertidaoPesquisar() {
        return certidaoPesquisar;
    }

    public void setCertidaoPesquisar(CertidaoObito certidaoPesquisar) {
        this.certidaoPesquisar = certidaoPesquisar;
    }

    public CertidaoObito getCertidaoVisualizar() {
        return certidaoVisualizar;
    }

    public void setCertidaoVisualizar(CertidaoObito certidaoVisualizar) {
        this.certidaoVisualizar = certidaoVisualizar;
    }

    public List<CertidaoObito> getCertidoes() {
        return certidoes;
    }

    public void setCertidoes(List<CertidaoObito> certidoes) {
        this.certidoes = certidoes;
    }

    public Pessoa getPessoaEditar() {
        return pessoaEditar;
    }

    public void setPessoaEditar(Pessoa pessoaEditar) {
        this.pessoaEditar = pessoaEditar;
    }

    public Pessoa getPessoaPesquisar() {
        return pessoaPesquisar;
    }

    public void setPessoaPesquisar(Pessoa pessoaPesquisar) {
        this.pessoaPesquisar = pessoaPesquisar;
    }

    public Pessoa getPessoaVisualizar() {
        return pessoaVisualizar;
    }

    public void setPessoaVisualizar(Pessoa pessoaVisualizar) {
        this.pessoaVisualizar = pessoaVisualizar;
    }
}